外观
1. Elasticsearch 核心功能
Elasticsearch 是一个分布式、高性能的搜索引擎和分析引擎,专为处理大规模数据而设计。
1.1 核心特性概述
1.1.1 全文搜索能力
- 倒排索引: 实现高效的文本搜索和匹配
- 分词器: 支持多种语言的分词和词干提取
- 相关性评分: 基于 TF-IDF 和 BM25 的评分算法
- 模糊搜索: 支持拼写错误容忍和近似匹配
搜索优化技巧
- 合理设计字段映射类型
- 使用适当的分词器
- 配置搜索分析器链
1.1.2 近实时分析
- 准实时索引: 写入数据后 1 秒内即可搜索
- 实时聚合: 支持实时数据聚合和统计
- 流式处理: 持续的数据流处理能力
- 内存缓存: 智能缓存机制提升查询性能
1.1.3 分布式架构
- 水平扩展: 动态添加节点扩展集群容量
- 自动负载均衡: 智能数据分布和查询路由
- 故障自动恢复: 节点故障时自动数据迁移
- 高可用保证: 多副本机制确保数据安全
1.2 Elasticsearch 架构设计
1.2.1 整体架构图
节点角色说明
- 主节点: 负责集群管理、索引创建、节点分配等
- 数据节点: 存储数据、执行搜索和聚合操作
- 协调节点: 路由请求、聚合结果、负载均衡
1.2.2 节点类型详解
| 节点类型 | 职责 | 配置参数 | 推荐配置 |
|---|---|---|---|
| 主节点 | 集群协调、元数据管理 | node.master: truenode.data: false | CPU 和内存充足 |
| 数据节点 | 数据存储、搜索执行 | node.master: falsenode.data: true | 高 I/O 性能 |
| 协调节点 | 请求路由、结果聚合 | node.master: falsenode.data: falsenode.ingest: false | 网络 I/O 优化 |
| 摄取节点 | 数据预处理 | node.master: falsenode.data: falsenode.ingest: true | 计算资源充足 |
2. 索引和映射管理
2.1 索引 (Index) 概念
2.1.1 索引定义和特征
- 逻辑容器: 相关文档的集合体
- 类比关系: 相当于传统数据库中的数据库
- 动态创建: 支持动态索引创建和配置
- 多租户: 单集群支持多个索引隔离
2.1.2 索引生命周期
2.1.3 索引配置最佳实践
索引设计原则
- 命名规范: 使用小写字母、数字和连字符
- 分片规划: 根据数据量和查询模式设计分片数
- 副本策略: 生产环境至少配置 1 个副本
- 刷新间隔: 根据实时性需求调整刷新频率
2.2 映射 (Mapping) 管理
2.2.1 映射类型
| 字段类型 | 描述 | 示例 |
|---|---|---|
| text | 全文本搜索 | 文章内容、日志消息 |
| keyword | 精确匹配 | 标签、状态码、IP 地址 |
| date | 日期时间 | 时间戳、创建时间 |
| long/integer | 整数数值 | 计数器、ID |
| double/float | 浮点数值 | 百分比、评分 |
| boolean | 布尔值 | 启用/禁用标志 |
| object | 嵌套对象 | 用户信息、配置对象 |
2.2.2 动态映射策略
yaml
# 动态映射配置
PUT /my-index/_mapping
{
"dynamic": "strict", # strict | true | false
"properties": {
"user": {
"type": "object",
"properties": {
"name": { "type": "text" },
"age": { "type": "integer" }
}
}
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
映射变更限制
Elasticsearch 不支持已存在字段的映射类型修改。 映射变更需要重建索引或使用别名滚动更新策略。
3. 分片和副本机制
3.1 分片 (Shard) 架构
3.1.1 分片类型
- 主分片: 数据写入和读取的原始分片
- 副本分片: 主分片的完整复制,提供高可用和负载均衡
- 分片数量: 索引创建后主分片数量不可变更
3.1.2 分片分配策略
- 均匀分布: 数据在集群节点间均匀分配
- 负载均衡: 考虑节点负载和存储容量
- 故障恢复: 节点故障时自动重新分配分片
- 容量扩展: 新节点加入时自动数据迁移
3.2 副本 (Replica) 机制
3.2.1 副本作用
| 功能 | 说明 | 优势 |
|---|---|---|
| 高可用 | 主分片故障时自动切换 | 业务连续性 |
| 负载均衡 | 分担读请求压力 | 提升查询性能 |
| 数据冗余 | 多份数据副本 | 数据安全性 |
| 容错能力 | 节点故障自动恢复 | 系统稳定性 |
3.2.2 副本配置策略
yaml
# 动态调整副本数量
PUT /my-index/_settings
{
"index": {
"number_of_replicas": 2 # 生产环境建议 1-2 个副本
}
}1
2
3
4
5
6
7
2
3
4
5
6
7
副本数量建议
- 开发环境: 0 个副本(节省资源)
- 生产环境: 1-2 个副本(平衡性能和可用性)
- 关键业务: 2 个以上副本(最高可用性)
3.3 数据路由机制
3.3.1 文档路由计算
shard_num = hash(_routing) % num_primary_shards1
- 路由字段: 默认使用文档
_id,可自定义_routing - 一致性哈希: 确保相同路由值始终分配到同一分片
- 分片定位: 通过路由算法确定文档所在分片
3.3.2 查询路由流程
4. 集群管理与监控
4.1 集群状态监控
4.1.1 健康状态检查
bash
# 集群健康状态
GET /_cluster/health
# 响应示例
{
"cluster_name": "elasticsearch",
"status": "green", # green | yellow | red
"number_of_nodes": 3,
"number_of_data_nodes": 3,
"active_primary_shards": 10,
"active_shards": 20,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
集群状态说明
- green: 所有主分片和副本分片都正常分配
- yellow: 所有主分片正常,但某些副本分片未分配
- red: 有主分片未分配,集群功能受限
4.1.2 性能监控指标
| 指标类型 | 监控内容 | 告警阈值 |
|---|---|---|
| JVM | 堆内存使用率、GC 频率 | >85% |
| 磁盘 | 存储使用率、I/O 负载 | >90% |
| CPU | 使用率、负载平均值 | >80% |
| 网络 | 带宽使用、连接数 | 根据容量 |
| 查询 | 响应时间、错误率 | >5 秒 / >1% |
4.2 容量规划
4.2.1 存储容量估算
总存储需求 = (日数据量 × 保留天数 × 副本数 × 安全系数) / 压缩率1
- 日数据量: 根据业务日志量评估
- 保留策略: 根据合规和业务需求确定
- 安全系数: 通常取 1.5-2.0
- 压缩率: Elasticsearch 默认压缩比约 10-20%
4.2.2 性能容量规划
| 场景 | 推荐配置 | 说明 |
|---|---|---|
| 小规模 | 3 节点 × 16GB 内存 | 每日 < 10GB 数据 |
| 中规模 | 5-7 节点 × 32GB 内存 | 每日 10GB-100GB 数据 |
| 大规模 | 10+节点 × 64GB 内存 | 每日 > 100GB 数据 |
扩展策略
- 垂直扩展: 增加单节点资源(内存、CPU、存储)
- 水平扩展: 增加集群节点数量
- 混合扩展: 结合两种方式,根据成本和性能需求选择
4.3 备份和恢复
4.3.1 快照备份策略
yaml
# 创建快照仓库
PUT /_snapshot/my_backup
{
"type": "fs",
"settings": {
"location": "/mnt/backup/elasticsearch"
}
}
# 执行快照
PUT /_snapshot/my_backup/snapshot_2024-01-01
{
"indices": "logstash-*",
"ignore_unavailable": true,
"include_global_state": false
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
4.3.2 恢复流程
备份最佳实践
- 定期备份: 根据数据重要性设置备份频率
- 多份存储: 备份到多个位置确保安全性
- 测试恢复: 定期测试备份恢复流程
- 保留策略: 根据合规要求设置保留期限
5. 性能优化
5.1 索引优化
5.1.1 索引设置优化
yaml
PUT /my-index
{
"settings": {
"refresh_interval": "30s", # 刷新间隔
"number_of_shards": 3, # 分片数量
"number_of_replicas": 1, # 副本数量
"translog": {
"durability": "async", # 事务日志策略
"sync_interval": "5s"
}
}
}1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
5.1.2 合并策略优化
- 段合并: 定期合并小索引段提升查询性能
- 强制合并: 在低峰期执行段合并操作
- 合并策略: 根据写入模式选择适当的合并策略
5.2 查询优化
5.2.1 查询缓存
- 节点查询缓存: 缓存查询结果提升性能
- 分片请求缓存: 缓存分片级别的查询结果
- 字段数据缓存: 缓存字段数据用于聚合操作
5.2.2 索引排序
yaml
PUT /my-index/_settings
{
"index": {
"sort": {
"field": ["timestamp", "user_id"],
"order": ["desc", "asc"]
}
}
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
性能优化清单
- [ ] 配置适当的 JVM 堆内存
- [ ] 优化索引分片和副本配置
- [ ] 使用索引别名管理索引生命周期
- [ ] 实施查询缓存策略
- [ ] 监控和调整合并策略
- [ ] 定期删除过期索引